#!/bin/bash
#author:guojun
#date:2016-09-19

######################################################## 
# CentOS x86-64环境下Oracle 11gR2的一键式傻瓜安装包,使用步骤说明
#    1. 保证机器有足够的磁盘空间,至少20G
#    2. Swap空间至少设置为物理内存的1.5倍,最大16G
#    3. 保证yum可用,配置了本地源,或者可以上网
#    4. 修改all_in_one_install.sh中顶部的安装参数,包括用户,密码,压缩包名称。
#    5. root登录运行 bash all_in_one_install.sh | tee  aio_`date +%Y%m%d_%H%M`.log 
#
# 警告：一键式安装全部采用默认配置参数,如果在任何生产环境使用,后果自负。   
#
# 如果想进行更加细粒度的配置,可以修改静默配置文件。更详细信息请参考
# http://www.cnblogs.com/wait4friend/archive/2012/11/16/2773508.html
#    
######################################################## 
## oracle用户密码(请修改)
ORACLE_PASSWD=oracle
## 数据库SID(请修改)
DB_SID=XTPLAT
## 数据库DBA密码(请修改)
SYS_PASSWD=123456
## ZIP安装包的地址(请修改)
ZIP_DIR=/usr/local/src
ZIP_SRC_1=$ZIP_DIR/p10404530_112030_Linux-x86-64_1of7.zip
ZIP_SRC_2=$ZIP_DIR/p10404530_112030_Linux-x86-64_2of7.zip

## 下面的配置信息不能修改！！！
# ZIP解压后地址
ZIP_DEST=/home/oracle/upload
## 目录前缀,根据习惯添加
DIR_PREFIX=""
## 数据库基目录
ORA_BASE=/u01/app/oracle
## 数据库主目录
ORA_HOME=$ORA_BASE/product/11.2.0/dbhome_1
## 配置文件
ORA_PROFILE=/home/oracle/.bash_profile 

########################################################
#前置检测项：通过才能进行下一步安装操作
#1：检测磁盘空间
checkdisk ()
{   		
	#允许的最小磁盘空间
	local MinDiskSize=1024
	#当前根分区空间大小
	local TotalSize=`df -m | grep '/$' | gawk '{print $2}'`     		
	#当前根分区已使用空间大小
	local UseSize=`df -m | grep '/$' | gawk '{print $3}'`     	
	#空余空间	
	local FreeSize=$[ $TotalSize - $UseSize ]				
	#标记退出状态
	local tag=1	
	local info="根分区：       当前系统根分区大小为$TotalSize(MB),剩余空间为$FreeSize(MB),允许的最小空间$MinDiskSize(MB),检查通过！"					
	if [ $FreeSize -gt $MinDiskSize ] 
	then
		tag=0 && echo -e "\E[1;32m ${info}\E[0m" | sed 's/允许/大于&/'
	else 
		echo -e "\E[1;31m ${info}\E[0m" | sed 's/允许/小于&/;s/通过/未&/'
	fi
	return $tag
}

#2：检测交换分区
checkswap ()
{			
	#交换分区大小
	local SwapSize=`free -m |grep 'wap' | gawk '{print $2}'` 
	#允许的最小交换分区大小					
	local MinSwap=2000	
	#标记退出状态
	local tag=1		
	local info="交换分区：     当前系统交换分区大小为$SwapSize(MB),允许的最小交换分区$MinSwap(MB),检查通过！"					
	if [ $SwapSize -gt $MinSwap ] 
	then
		tag=0 && echo -e "\E[1;32m ${info}\E[0m" | sed 's/允许/大于&/'
	else
		echo -e "\E[1;31m ${info}\E[0m" | sed 's/允许/小于&/;s/通过/未&/'
	fi
	return $tag 
}

#3：检测内存
checkmem ()
{
	#允许的最小内存大小	
	local MinMem=1000	
	#系统分配的内存总量  
	local mem_total=`free -m | grep Mem | awk '{print  $2}'`   
	#当前剩余的free大小  
	local mem_free=`free -m | grep Mem | awk '{print  $4}'`   
	#当前已使用的used大小  
	local mem_used=`free -m | grep Mem | awk '{print  $3}'` 
	#标记退出状态
	local tag=1		
	local info="内存：         当前系统总内存为$mem_total(MB),允许的最小内存$MinMem(MB),检查通过！"					
	if [ $mem_total -gt $MinMem ] 
	then
		tag=0 && echo -e "\E[1;32m ${info}\E[0m" | sed 's/允许/大于&/'
	else
		echo -e "\E[1;31m ${info}\E[0m" | sed 's/允许/小于&/;s/通过/未&/'
	fi
	return $tag  
}

#4：检查hostname是否已设置并绑定IP地址
checkhostname ()
{ 
	#标记退出状态
	local tag=0	 
	local host=`hostname`
	if [ `hostname | grep localhost` ]
	then
		tag=1 && echo -e "\E[1;31m 主机名:        未设置,请在/etc/hosts,/etc/sysconfig/network文件中进行设置并绑定IP地址!\E[0m"
	else 
		#判断hostname在/etc/hosts中和在/etc/sysconfig/network同时存在才有效
		if cat /etc/hosts | grep $host>/dev/null && cat /etc/sysconfig/network | grep $host>/dev/null
		then
			echo -e "\E[1;32m 主机名：       $host,已在/etc/hosts,/etc/sysconfig/network文件中进行设置并绑定IP地址!\E[0m"
		else
			tag=1 && echo -e "\E[1;31m 主机名:        已设置,但未绑定IP地址,请在/etc/hosts中进行设置并绑定IP地址!\E[0m"
		fi
	fi
	return $tag
}

#5：检测本机物理IP地址是否连接正常
pingip ()
{
	#标记退出状态
	local tag=1	
	local info="本地网络连接： 连接正常,检查通过！"
	#注意：获取物理IP地址可能会有多个IP地址的情况,这里取第一个IP地址为默认IP地址
	local localip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"|head -1` 
	if [ $localip ]
	then
		tag=0 && echo -e "\E[1;32m ${info}\E[0m" | sed 's/连接正/物理IP为'$localip',&/'
	else
		echo -e "\E[1;31m ${info}\E[0m" | sed 's/正常/不&/;s/通过/未&/'
	fi
	return $tag  
}

#6：检测Oracle是否安装
checkoracle ()
{
	#该文件不一定存在,所以抛弃错误消息
	source $ORA_PROFILE >/dev/null 2>&1
	source /etc/profile 
	#标记退出状态
	local tag=1	
	
	if sqlplus -v >/dev/null 2>&1
	then
		tag=0 
	fi
	return $tag  
}

########################################################
# 安装前的检查
precheck()
{
	echo -e "\E[1;37m 以下为安装Oracle的基本要求,如果不能通过,则终止自动安装,直到修改并检查通过\E[0m" 
	#标记退出状态
	local tag=0		
    if [ ! -f "${ZIP_SRC_1}" -o ! -f "${ZIP_SRC_2}" ]; then
        echo -e "\E[1;31m 安装文件：     未检测到Oracle压缩包文件,请将它拷贝到$ZIP_DIR下!\E[0m" 
		tag=1
	else
        echo -e "\E[1;32m 安装文件：     已检测到Oracle压缩包文件,检查通过！\E[0m" 
    fi  
    #1：检测磁盘空间 
    checkdisk || tag=$[ $tag + $? ]
    #2：检测交换分区
    checkswap || tag=$[ $tag + $? ] 
	#3：检测内存
	checkmem || tag=$[ $tag + $? ] 
	#4：检查hostname是否已设置并绑定IP地址
	checkhostname || tag=$[ $tag + $? ] 
	#5：检测本机物理IP地址是否连接正常
	pingip || tag=$[ $tag + $? ] 
	if [ $tag -gt 0 ]; then
		echo -e "\E[1;37m 检测项：${tag}项未通过,安装操作立即终止,请根据以上提示做相应修改！\E[0m" 
		#退出状态值设定为1
		exit 1
	else
		echo -e "\E[1;37m 检测项：所有项均通过,自动进行下一步操作！\E[0m" 
	fi
}

########################################################
# 创建用户,组,目录
create_user()
{
    echo -e " －－提示：－－－－－－－开始创建oracle用户、用户组、安装目录,请稍等...－－－－－－－"
    sleep 1
	
	#创建Oracle用户组
	egrep "^dba" /etc/group >& /dev/null
	[ $? -ne 0 ] && groupadd dba 

	egrep "^oinstall" /etc/group >& /dev/null
	[ $? -ne 0 ] && groupadd oinstall  
	
	#创建Oracle用户,不存在则创建,存在则跳过
    if ! grep -q "^oracle:" /etc/passwd; then
        #echo -e " －－提示：－－－－－－－oracle用户已存在,跳过创建！－－－－－－－"
    #else
        useradd -g oinstall -G dba -d /home/oracle -s /bin/bash -m oracle
        id oracle
        echo $ORACLE_PASSWD | passwd --stdin oracle
    fi
    
    mkdir -p ${ORA_BASE}
    mkdir -p ${ORA_BASE}/oradata
    mkdir -p ${DIR_PREFIX}/u01/redo
    mkdir -p ${DIR_PREFIX}/u02/archivedlog
    mkdir -p ${DIR_PREFIX}/u02/rmanbackup
    mkdir -p ${DIR_PREFIX}/u02/dpdump
    mkdir -p /home/oracle/script
    mkdir -p /home/oracle/upload
    mkdir -p /home/oracle/local/bin
    
    \cp -f ./rlwrap_static_x64 /home/oracle/local/bin/
    chmod +x /home/oracle/local/bin/*
    rm -rf /home/oracle/local/bin/rlwrap && ln -s /home/oracle/local/bin/rlwrap_static_x64 /home/oracle/local/bin/rlwrap

    chown -R oracle:oinstall /home/oracle
    chown -R oracle:oinstall ${DIR_PREFIX}/u01
    chown -R oracle:oinstall ${DIR_PREFIX}/u02
    chmod -R 775 ${DIR_PREFIX}/u01
    chmod -R 775 ${DIR_PREFIX}/u02
    
	#配置文件复位(请注意/home/oracle/.bash_profile和/etc/profile的内容最好都做处理,Oracle的配置最好写在/home/oracle/.bash_profile中)
	sed -i '/export ORACLE_BASE=/d' $ORA_PROFILE
	sed -i '/export ORACLE_HOME=/d' $ORA_PROFILE
	sed -i '/export ORACLE_HOME_LISTNER=/d' $ORA_PROFILE
	sed -i '/export ORACLE_PATH=/d' $ORA_PROFILE
	sed -i '/export ORACLE_SID=/d' $ORA_PROFILE
	sed -i '/export PATH=/d' $ORA_PROFILE
	sed -i '/export LD_LIBRARY_PATH=/d' $ORA_PROFILE
	sed -i '/export SQLPATH=/d' $ORA_PROFILE
	sed -i '/export NLS_LANG=/d' $ORA_PROFILE
	sed -i '/alias sqlplus=/d' $ORA_PROFILE
	sed -i '/alias rman=/d' $ORA_PROFILE
	#删除多余的空行(包括由空格组成的空行,以及由回车组成的空行)
	sed -i '/^ *$/d' $ORA_PROFILE
	
	sed -i '/export ORACLE_BASE=/d' /etc/profile
	sed -i '/export ORACLE_HOME=/d' /etc/profile
	sed -i '/export ORACLE_HOME_LISTNER=/d' /etc/profile
	sed -i '/export ORACLE_PATH=/d' /etc/profile
	sed -i '/export ORACLE_SID=/d' /etc/profile
	sed -i '/export NLS_LANG=/d' /etc/profile	 
	
    PROFILE="
export ORACLE_BASE=${ORA_BASE}
export ORACLE_HOME=${ORA_HOME}
export ORACLE_HOME_LISTNER=\$ORACLE_HOME
export ORACLE_PATH=\$ORACLE_HOME/rdbms/admin
export ORACLE_SID=${DB_SID}
export PATH=/usr/local/bin:/home/oracle/local/bin:\$PATH:\$ORACLE_HOME/bin::~/local/bin
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$ORACLE_HOME/lib
export SQLPATH=~/script
export NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
     
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'    
    "  
    echo "${PROFILE}" >> $ORA_PROFILE
    source $ORA_PROFILE
}

########################################################
# 后台进程超时终止运行,当前设置阈值：120S
timeout()
{ 
	#默认设定超时120S终止进程,并给出提示信息,存放到time.out文件中 
    waitfor=120
	if [ $# -ge 3 ]; then
		waitfor=$3
	fi 
    command=$*
	$command &
	commandpid=$!
	( sleep $waitfor ; kill -9 $commandpid  > /dev/null 2>&1 && echo -e "$2" | tee time.out ) &
	watchdog=$!
	sleeppid=$PPID
	wait $commandpid > /dev/null 2>&1
	kill $sleeppid > /dev/null 2>&1
}

########################################################
# yum数据库更新
yumupdate ()
{ 
	yum -y update
}

########################################################
# 关闭数据库实例
shutdowndb()
{
	su - oracle -lc ${ORA_HOME}/bin/dbshut > /dev/null 2>&1
}

########################################################
# 关闭数据库监听
stoplsn ()
{
	su - oracle -lc "${ORA_HOME}/bin/lsnrctl stop" > /dev/null 2>&1  
}

########################################################
# 卸载数据库（可选）
uninstall_oracle()
{
    echo -e " －－提示：－－－－－－－开始卸载现有安装的Oracle数据库,请稍等...－－－－－－－"
	#1：停止数据库  
	local var=`ps aux | grep ora_ | grep -v grep`
	if [ ! "$var" = "" ]; then
		echo -e " －－－－－－－－－－－－停止数据库实例－－－－－－－"
		#超时则终止操作
		timeout shutdowndb " －－－－－－－－－－－－停止数据库实例超时,退出该操作！－－－－－－－"
	fi 
	#2：停止Listener
	var=`ps aux | grep ${ORA_HOME}/bin/tnslsnr | grep -v grep`
	local SIDLIST=`ps -ef | grep "${ORA_HOME}/bin/tnslsnr" | grep -v grep |awk '{print $2}'`
	if [ ! "$var" = "" ]; then
		echo -e " －－－－－－－－－－－－停止监听－－－－－－－"
		#超时则终止操作
		timeout shutdowndb " －－－－－－－－－－－－停止监听超时,退出该操作！－－－－－－－" 
		#杀死所有监听进程 
		for sid in $SIDLIST
		do 
			expr $sid + 0 &>/dev/null 
			if [ $? -eq 0 ]; then
				kill -9 $sid > /dev/null 2>&1  
			fi
		done
	fi  
	#3：关闭默认监听端口1521的进程,需精确匹配1521,防止误杀类似01521、15216之类的进程
	#local PID=`lsof -i:1521 |awk '{print $2}' | tail -n 2`
	local PID=`netstat -anp |grep -w 1521 |awk '{printf $7}'|cut -d/ -f1`
	expr $PID + 0 &>/dev/null 
	if [ $? -eq 0 ]; then
		kill -9 $PID > /dev/null 2>&1  
	fi
	#4：停止HTTP服务
	service httd stop > /dev/null 2>&1
	#5：删除安装目录
    #rm -rf ${DIR_PREFIX}
	rm -rf /u01
	rm -rf /u02
	#6：将/usr/bin下的文件删除
	rm -rf /usr/local/bin/dbhome
	rm -rf /usr/local/bin/oraenv
	rm -rf /usr/local/bin/coraenv
	#7：将/etc/oratab删除
	rm -rf /etc/oratab
	#8：将/etc/oraInst.loc删除
    rm -rf /etc/oraInst.loc
	#9：删除临时文件夹关于Oracle的文件和日志
    rm -rf /tmp/Ora* 
	#10：将Oracle的启动服务删除
	chkconfig --del dbora > /dev/null 2>&1
	#CentOS7关闭服务
	systemctl stop dbora > /dev/null 2>&1
    echo -e " －－提示：－－－－－－－Oracle数据库卸载完成!－－－－－－－"
}

########################################################
# 更改linux的核心参数。
fixup_param()
{
    echo -e " －－提示：－－－－－－－临时禁用防火墙－－－－－－－"
	#CentOS6.5与CentOS7的防火墙关闭方式不一样,请注意
    chkconfig iptables off > /dev/null 2>&1
	#CentOS7关闭防火墙
	systemctl stop firewalld.service > /dev/null 2>&1
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    echo -e " －－提示：－－－－－－－开始修改核心参数,请稍等...－－－－－－－"
    sleep 1
    bash runfixup.sh
}

#检测程序是否已安装
checkyum ()
{    
	local tag=1
	program=`rpm -qa | grep $1 | wc -l`
	if [ $program -ge 1 ]
	then
		tag=0
	fi 
	return $tag	
}

########################################################
# 安装必要的包
install_package()
{
	echo -e " －－提示：－－－－－－－开始以yum方式安装必要的包,请稍等...－－－－－－－"
	#更新系统
	#解决yum update时候出现Another app is currently holding the yum lock
	rm -rf /var/run/yum.pid && rm -rf /var/lib/rpm/.rpm.lock 
	rm -rf time.out
	sleep 5s
	#控制rpm更新时间在2分钟以内,否则认为rpm数据库损坏,进行重建
	timeout yumupdate " －－提示：－－－－－－－检测到yum update超过两分钟无响应,可能RPM数据库损坏,将自动重建rpm数据库...－－－－－－－"
	sleep 1s
	if [ -s time.out ]; then 
		#将rpm所用的数据库删除
		rm -rf /var/lib/rpm/__db* && rm -rf /var/run/yum.pid && rm -rf /var/lib/rpm/.rpm.lock
		#将重建rpm数据库
		rpm --rebuilddb >/dev/null 2>&1 
		echo -e " －－提示：－－－－－－－rpm数据库重建完成,继续安装必要的包...－－－－－－－"  
		yum -y update
	fi
    yum -y install binutils 
	yum -y install compat-db 
	yum -y install compat-gcc-34 
	yum -y install compat-gcc-34-c++ 
	yum -y install compat-libstdc++-33 
	yum -y install elfutils-libelf-devel 
	yum -y install gcc 
	yum -y install gcc-c++ 
	yum -y install glibc-* 
	yum -y install libXp.so.6 
	yum -y install libXt.so.6 
	yum -y install libXtst.so.6 
	yum -y install libgcc_s.so.1 
	yum -y install libXp 
	yum -y install libaio-devel 
	yum -y install numactl 
	yum -y install numactl-devel 
	yum -y install unixODBC 
	yum -y install unixODBC-devel 
	yum -y install pdksh

	#检测程序是否已安装
	checkyum binutils || yum -y install binutils
	checkyum compat-db || yum -y install compat-db
	checkyum compat-gcc-34 || yum -y install compat-gcc-34
	checkyum compat-gcc-34-c++ || yum -y install compat-gcc-34-c++
	checkyum compat-libstdc++-33 || yum -y install compat-libstdc++-33
	checkyum elfutils-libelf-devel || yum -y install elfutils-libelf-devel
	checkyum gcc || yum -y install gcc
	checkyum gcc-c++ || yum -y install gcc-c++
	checkyum glibc-*  || yum -y install glibc-* 
	checkyum libXp.so.6 || yum -y install libXp.so.6
	checkyum libXt.so.6 || yum -y install libXt.so.6
	checkyum libXtst.so.6 || yum -y install libXtst.so.6
	checkyum libgcc_s.so.1 || yum -y install libgcc_s.so.1
	checkyum libXp || yum -y install libXp
	checkyum libaio-devel || yum -y install libaio-devel
	checkyum numactl || yum -y install numactl
	checkyum numactl-devel || yum -y install numactl-devel
	checkyum unixODBC || yum -y install unixODBC
	checkyum unixODBC-devel || yum -y install unixODBC-devel
	checkyum pdksh || yum -y install pdksh  
}

########################################################
# 解压安装文件
unzip_oracle()
{
    echo -e " －－提示：－－－－－－－开始解压压缩包文件1,请稍等...－－－－－－－"
    unzip -q -o "${ZIP_SRC_1}" -d "${ZIP_DEST}"
    echo -e " －－提示：－－－－－－－开始解压压缩包文件2,请稍等...－－－－－－－"
    unzip -q -o "${ZIP_SRC_2}" -d "${ZIP_DEST}"
}

########################################################
# 静默安装文件参数替换
replace_rsp()
{
    echo -e " －－提示：－－－－－－－开始调整静默配置文件,请稍等...－－－－－－－"
    # 静默安装软件
	# 在s后加@,#,$ 等等....     代替范围s/,防止出现异常情况或无法用变量值进行替换
    \cp -f aio_db_install_swonly.rsp my_db_install_swonly.rsp
    sed -i "s#PH_ORACLE_HOSTNAME#`hostname`#" my_db_install_swonly.rsp
    sed -i "s#PH_INVENTORY_LOCATION#${DIR_PREFIX}/u01/app/oraInventory#" my_db_install_swonly.rsp
    sed -i "s#PH_ORACLE_BASE#${ORA_BASE}#" my_db_install_swonly.rsp
    sed -i "s#PH_ORACLE_HOME#${ORA_HOME}#" my_db_install_swonly.rsp
    
    # 静默安装数据库
    \cp -f aio_dbca_createdb.rsp my_dbca_createdb.rsp
    sed -i "s#PH_GDBNAME#${DB_SID}#" my_dbca_createdb.rsp
    sed -i "s#PH_SID#${DB_SID}#" my_dbca_createdb.rsp
    sed -i "s#PH_SYSPASSWORD#${SYS_PASSWD}#" my_dbca_createdb.rsp
    sed -i "s#PH_SYSTEMPASSWORD#${SYS_PASSWD}#" my_dbca_createdb.rsp  
    sed -i "s#PH_DATAFILEDESTINATION#${ORA_BASE}/oradata#" my_dbca_createdb.rsp 

    # 修改后的文件放到oracle下
    \mv -f my_db_install_swonly.rsp /home/oracle/upload/
    \mv -f my_dbca_createdb.rsp /home/oracle/upload/
    
    \cp -f dg_start_db.sh /home/oracle/script/
	\cp -f create_tbs.sql /home/oracle/script/
	\cp -f quitsqlplus.txt /home/oracle/script/
    
    chown -R oracle:oinstall /home/oracle
    chown -R oracle:oinstall ${ZIP_DEST}/database
    chmod +x /home/oracle/script/*.sh
}

########################################################
# 安装数据库软件 
install_software()
{
    su - oracle <<EOF
        echo -e " －－提示：－－－－－－－开始修改静默软件安装文件,请稍等...－－－－－－－"
        grep -E '^(oracle.install.option|ORACLE_HOSTNAME|UNIX_GROUP_NAME|INVENTORY_LOCATION|SELECTED_LANGUAGES|ORACLE_HOME|ORACLE_BASE|oracle.install.db.InstallEdition|oracle.install.db.isCustomInstall|oracle.install.db.DBA_GROUP|oracle.install.db.OPER_GROUP|DECLINE_SECURITY_UPDATES)' /home/oracle/upload/my_db_install_swonly.rsp
        echo -e " －－提示：－－－－－－－开始以oracle用户身份安装数据库软件,请稍等...－－－－－－－"  
        cd ${ZIP_DEST}/database
        bash ${ZIP_DEST}/database/runInstaller -silent -force -responseFile /home/oracle/upload/my_db_install_swonly.rsp
        exit
EOF
}

########################################################
# 检查静默安装数据库软件的进度文件
check_install_software()
{
    Inventory_location=${DIR_PREFIX}/u01/app/oraInventory
    Log_Install=${Inventory_location}/logs/installActions*.log
	#判断日志文件是否存在，有时候可能存在于tmp目录下
	if [ ! -f ${Log_Install} ]; then 
		Log_Install=/tmp/OraInstall*/ins*.log
	fi 
    Sleep_Seconds=60
    Finish_Install=0
    Finish_Counter=0
    while [ ${Finish_Install} -eq 0 -a ${Finish_Counter} -lt 99 ]; do
        sleep ${Sleep_Seconds}
		###############################################################################
		#此处检测日志文件信息项来判定安装程序是否完成。
		#信息提示可能为中文或者英文
		#英文提示：INFO：Shutdown Oracle Database 11g Release 2 Installer
		#中文提示：信息：Shutdown Oracle Database 11g 发行版 2 安装程序
		###############################################################################
        Finish_Install=`grep -E 'Shutdown Oracle Database 11g' ${Log_Install} | wc -l `
        let Finish_Counter=Finish_Counter+1
        echo -e " 第 ${Finish_Counter} 次检查安装过程..."
        tail -1 ${Log_Install}
    done
    
    if [ ${Finish_Install} -eq 1 ]; then
        echo -e " －－提示：－－－－－－－安装软件成功,执行后续配置... －－－－－－－"
        sleep 1
        bash ${Inventory_location}/orainstRoot.sh
        bash ${ORA_HOME}/root.sh
    else
        echo -e " －－错误信息：安装过程太长,估计发生错误,请检查日志文件 ${Log_Install} "
        exit 1
    fi
}

########################################################
# 安装数据库 
install_database()
{   
    su - oracle <<EOF
        cd ${ORA_HOME}/bin
        echo -e " －－提示：－－－－－－－安装监听,请稍等...－－－－－－－"
        bash ${ORA_HOME}/bin/netca -silent -responseFile ${ORA_HOME}/assistants/netca/netca.rsp
        
        echo -e " －－提示：－－－－－－－修改静默数据库安装文件,请稍等...－－－－－－－"
        grep -E '^(GDBNAME|SID|TEMPLATENAME|SYSPASSWORD|SYSTEMPASSWORD|CHARACTERSET|NATIONALCHARACTERSET|DATAFILEDESTINATION|MEMORYPERCENTAGE|TOTALMEMORY)' /home/oracle/upload/my_dbca_createdb.rsp
        
        echo -e " －－提示：－－－－－－－以oracle用户身份安装数据库,请稍等...－－－－－－－" 
        bash ${ORA_HOME}/bin/dbca -silent -responseFile /home/oracle/upload/my_dbca_createdb.rsp
        
        exit
EOF
	#配置静态监听
	setup_local_listener
	#修改ORACLE_HOSTNAME
	setup_Oracle_Host
	
    echo -e " －－提示：－－－－－－－配置数据库自动启动－－－－－－－"
    sed -i '/dg_start_db.sh/d' /etc/rc.d/rc.local
	 
	#此处sed变量替换,采用双引号处理,/被用作了s命令匹配,需将将/替换成#
	#oratab文件存在则修改,不存在则创建
	if [ -f /etc/oratab ]; then
		sed -i "s#$ORACLE_HOME:N#$ORACLE_HOME:Y#g" /etc/oratab
	else
		echo "$DB_SID:$ORACLE_HOME:Y" > /etc/oratab
	fi
	
	sed -i "s#ORACLE_HOME_LISTNER=\$1#ORACLE_HOME_LISTNER=\$ORACLE_HOME#g" ${ORACLE_HOME}/bin/dbstart
	sed -i "s#ORACLE_HOME_LISTNER=\$1#ORACLE_HOME_LISTNER=\$ORACLE_HOME#g" ${ORACLE_HOME}/bin/dbshut

	#删除多余的空行(包括由空格组成的空行,以及由回车组成的空行)
	sed -i '/^ *$/d' /etc/rc.d/rc.local	
	sed -i '/lsnrctl/d' /etc/rc.d/rc.local	
	sed -i '/dbstart/d' /etc/rc.d/rc.local
	sed -i '/lsnrctl/d' /etc/rc.local	
	sed -i '/dbstart/d' /etc/rc.local 	
    echo 'su - oracle -c "/home/oracle/script/dg_start_db.sh"' >> /etc/rc.d/rc.local	
}

########################################################
# 创建表空间和用户 
create_tbs ()
{
	export NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
    source $ORA_PROFILE   
	echo -e " －－提示：－－－－－－－开始创建XTPLAT表空间和openVone用户,请稍等...－－－－－－－"
	chown oracle:oinstall /home/oracle/script/create_tbs.sql
	chmod +x /home/oracle/script/create_tbs.sql
	su - oracle -c "sqlplus sys/123456@${DB_SID} as sysdba @ /home/oracle/script/create_tbs.sql  </home/oracle/script/quitsqlplus.txt"
}

########################################################
# 配置静态监听
setup_local_listener ()
{
	local listenerora=${ORA_HOME}/network/admin/listener.ora
	#判断文件中是否有静态监听器,不存在则进行注册
	if ! grep 'SID_LIST_LISTENER' $listenerora >& /dev/null
	then
		local para="SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = XTPLAT)
      (ORACLE_HOME = ${ORA_HOME})
      (SID_NAME = XTPLAT)
    )
  )"
		echo "${para}" >> $listenerora
	fi
}

########################################################
# 安装完oracle数据库后修改ORACLE_HOSTNAME
setup_Oracle_Host()
{
	#由于主机名或者ip地址可能会变动导致数据库监听和服务不能用,故暂定Host为0.0.0.0
	local network=${ORA_HOME}/network/admin
	sed -i "s/(HOST.*=.*).*(/(HOST = 0.0.0.0)(/g" $network/listener.ora 
	sed -i "s/(HOST.*=.*).*(/(HOST = 0.0.0.0)(/g" $network/tnsnames.ora 

	if [ -f $network/listener.ora ]; then
		sed -i "s/(HOST.*=.*).*(/(HOST = 0.0.0.0)(/g" $network/listener.ora 
	else
		echo -e "\E[1;31m 监听配置文件(listener.ora)不存在,请检查数据库是否已正确安装,监听是否已建立.如未正确安装,建议重装数据库!\E[0m"
	fi
	if [ -f $network/tnsnames.ora ]; then
		sed -i "s/(HOST.*=.*).*(/(HOST = 0.0.0.0)(/g" $network/tnsnames.ora 	
	else
		echo -e "\E[1;31m 实例服务名文件(tnsnames.ora)不存在,请检查数据库是否已正确安装、实例XTPLAT是否已创建.如未正确安装,建议重装数据库!\E[0m"		
	fi	
}

########################################################
# 提示完成信息
congratulation()
{
    echo -e "\n ***********************************************************************"
    echo -e " ************* 完成Oracle 11gR2一键式安装,恭喜您！**********************"
    echo -e " ************ 请务必切换到oracle用户身份连接数据库！ *******************"
    echo -e " ****** 连接前刷新环境变量：source /home/oracle/.bash_profile **********"
    echo -e " ********** 连接方式：sqlplus openVone/openVone@xtplat *****************" 
    echo -e " ***********************************************************************"
	#由于父shell调用改shell可能会无法获取执行状态,故保存到文件进行处理.0-表示执行成功,其他-不成功
	echo 0 > pipeinfo
}

########################################################
# 完整操作步骤 
autoinstall ()
{
	#1：安装前的检查
	precheck
	#2：卸载已有Oracle数据库
	uninstall_oracle
	#3：创建Oracle用户
	create_user
	#4：更改linux的核心参数。
	fixup_param
	#5：安装必要的包
	install_package
	#6：解压Oracle压缩文件
	unzip_oracle
	#7：静默安装文件参数替换
	replace_rsp
	#8：安装数据库软件
	install_software
	#9：检查静默安装数据库软件的进度文件
	check_install_software
	#10：安装数据库实例 
	install_database
	
	########################################################
	#执行脚本前确保Oracle监听和数据库服务的正常开启！
	echo -e "\E[1;37m 开始检测Oracle监听和数据库服务是否正常启动,如未启动,将自动启动...\E[0m"
	#标记退出状态
	local tag=1
	#启动监听服务
	local var=`ps aux | grep ${ORACLE_HOME}/bin/tnslsnr | grep -v grep`
	if [ "$var" = "" ]; then
		echo -e "\E[1;37m Oracle监听未开启,开始尝试启动...\E[0m"
		su - oracle -lc "${ORACLE_HOME}/bin/lsnrctl start"  
	fi
	
	sleep 5s
	
	#启动数据库实例进程
	var=`ps aux | grep ora_ | grep -v grep`
	if [ "$var" = "" ]; then
		echo -e "\E[1;37m Oracle数据服务未开启,开始尝试启动...\E[0m"
		su - oracle -lc ${ORACLE_HOME}/bin/dbstart
	fi
	########################################################
		
	sleep 10s
		
(sqlplus -S "sys/123456 as sysdba" <<!
set heading off 
set feedback off
set pagesize 0 
set verify off
set echo off
select status from v\$instance;
exit
!
) | grep OPEN > /dev/null 2>&1
	if [ $? -eq 0 ]
	then 
		tag=0 && echo -e "\E[1;37m Oracle监听服务和实例进程检测启动完毕！\E[0m"
	else
(sqlplus -S "sys/123456@xtplat as sysdba" <<!
set heading off 
set feedback off
set pagesize 0 
set verify off
set echo off
select status from v\$instance;
exit
!
) | grep OPEN > /dev/null 2>&1
		if [ $? -eq 0 ]	
		then 
			tag=0 && echo -e "\E[1;37m Oracle监听服务和实例进程检测启动完毕！\E[0m"
		else	 
			echo -e "\E[1;31m Oracle监听服务和实例进程启动不正常,请参考上述错误信息进行检查修改！\E[0m"
		fi
	fi 
	
	if [ $tag -eq 0 ]; then  	
		#11：创建表空间和用户
		create_tbs
		#12：提示完成信息
		congratulation
	fi
}
 
touch pipeinfo
#清空文件内容
cat /dev/null > pipeinfo
  
if [ "$1" = "uninstall" ]; then	 
	#卸载数据库
	uninstall_oracle
else
	#检测Oracle是否已安装
	echo -e "\E[1;37m 开始检测Oracle数据库,如果Oracle未安装,将自动进行安装操作\E[0m"	
	checkoracle 
	#如果Oracle未安装,则进行下一步安装操作
	if [ $? -eq 1 ]; then
		autoinstall
		#将当前系统是否已安装数据库信息写入文件,用于判别是否备份数据库数据.1-未安装或者卸载重装,无需备份数据,0-已安装
		echo 1 > OraISSETUP
	#如果已安装数据库,则根据传入参数决定是直接退出安装、直接覆盖安装、提示安装
	else
		case $1 in
			#存在则不覆盖安装,直接退出安装
			noreplace)
				echo -e "\E[1;37m 当前系统已安装Oracle数据库！\E[0m" 
				echo 0 > OraISSETUP 
				#由于父shell调用改shell可能会无法获取执行状态,故保存到文件进行处理
				echo 0 > pipeinfo
			;;
			#直接覆盖安装,不给提示
			replace)
				echo -e "\E[1;37m 当前系统已安装Oracle数据库,将自动进行卸载重装\E[0m" 
				autoinstall
				echo 1 > OraISSETUP 
			;; 
			#给出提示是否覆盖安装
			*)
				read -p " 当前系统已安装Oracle数据库,是否进行卸载重装?(按'y'或者'yes'表示是,按其他键表示取消)"  ifinstall
				ifinstall=`echo $ifinstall | tr "A-Z" "a-z"`
				if [ "$ifinstall" = "y" -o "$ifinstall" = "yes" ]; then
					echo -e "\E[1;37m 您已确认对Oracle数据库卸载重装！\E[0m" 
					autoinstall
					echo 1 > OraISSETUP
				else
					echo -e "\E[1;37m 您已取消对Oracle数据库卸载重装！\E[0m" 
					echo 0 > OraISSETUP
				fi
			;;
		esac
	fi

	#安装完成,刷新环境变量 
	source $ORA_PROFILE 
fi